package br.com.winesys.geta.persistence.jpa;

import java.util.Map;
import java.util.Properties;
import java.util.TreeMap;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
 * Construtor de EntityManagerFactory.<p>
 * 
 * Constrói diferentes fábricas para cada unidade de persistência. 
 */
public final class JPAEntityManagerFactoryBuilder {

	private static Map<String, EntityManagerFactory> factories = new TreeMap<String, EntityManagerFactory>();

	/**
	 * Configura uma nova fábrica para a unidade de persistência informada.
	 * 
	 * @param persistenceUnit nome da unidade de persistência 
	 * @param properties parâmetros da fábrica
	 */
	public static void configure(String persistenceUnit, Properties properties) {
		final EntityManagerFactory emf = Persistence.createEntityManagerFactory(persistenceUnit, properties);
		JPAEntityManagerFactoryBuilder.factories.put(persistenceUnit, emf);
	}

	/**
	 * Obtém a fábrica da unidade informada.<p>
	 * 
	 * <b>Atenção</b> antes de ser chamado, a fábrica deve ter sido configurada com o método
	 * configure(String, Properties) 

	 * @see JPAEntityManagerFactoryBuilder.configure(String, PersistenceUnit)
	 * 
	 * @param persistenceUnit nome da unidade de persistência 
	 * @return EntityManager da unidade de persistência
	 */
	public static EntityManagerFactory getEntityManagerFactory(String persistenceUnit) {
		final EntityManagerFactory emf = JPAEntityManagerFactoryBuilder.factories.get(persistenceUnit);
		if (emf == null) {
			throw new RuntimeException(String.format("No entity manager factory configured for persistence unit: %s", persistenceUnit));
		}
		return emf;
	}
}
